<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>[5.3]-框架总结：术语表和PHP开发建议 | PhalApi(π框架) - PHP轻量级开源接口框架 - 助你创造价值！</title>
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    <meta content="yes" name="apple-mobile-web-app-capable">
    <meta content="black" name="apple-mobile-web-app-status-bar-style">
    <meta content="telephone=no" name="format-detection">
    <meta content="email=no" name="format-detection">
    <meta name="Author" content="PhalApi,ecitlm,dogstar">
    <meta name="description" content="[5.3]-框架总结：术语表和PHP开发建议，PhalApi是一个PHP轻量级开源接口框架，致力于快速开发接口服务。支持HTTP/SOAP/RPC等协议，可用于搭建接口/微服务/RESTful接口/Web Services。我们不断更新，保持生气；为接口负责，为开源负责！并承诺永久免费！">
    <meta name="keywords" content="PhalApi,phalapi,phalapi接口开发,后台接口开发,后台接口开发框架,接口开发,接口框架,开源接口框架,PHP后台接口开发,PHP接口开发,PHP接口框架,PHP后台接口框架,phalapi官网,PHP接口框架,php接口开发框架,php接口开发,php web框架,π框架,π开发框架,π接口框架,π接口开发框架,api接口,php接口,,PHP接口框架,phalapi文档,phalapi wiki,PhalApi文档,phalapi在线文档,phalapi官方文档">

    <link rel="stylesheet" type="text/css" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" media="screen">
    <link rel="stylesheet" type="text/css" href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.css" media="screen">
    <link rel="stylesheet" href="../css/main.css" />
    <link rel="stylesheet" href="../css/loading_bar.css" />
    <link rel="icon" href="http://webtools.qiniudn.com/dog_catch.png" type="image/x-icon" />
    <script src="../js/pace.min.js"></script>
	
	<!-- 代码高亮 -->
	<link rel="stylesheet" href="../css/highlight.min.css">
	<script src="../js/highlight.min.js"></script>
	<script>hljs.initHighlightingOnLoad();</script>
    
</head>

<body>
    <!-- navbar start -->
    <div class="navbar navbar-default navbar-fixed-top" id="mainnav" role="navigation">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand website_name" href="/"><!-- <span>PhalApi</span> --><strong>PhalApi</strong></a>
            </div>
            <div class="navbar-collapse collapse" aria-expanded="false" style="height: 1px;">
                <ul class="nav navbar-nav navbar-right" id="nav_bar">
                    <li><a href="/"><span class="glyphicon glyphicon-home"></span></a></li>
                    <li><a href="http://qa.phalapi.net/">社区</a></li>
                    <li><a href="/download.html">下载</a></li>
                    <li class="active"><a href="/wikis/">文档</a></li>
                    <li><a href="http://www.ituring.com.cn/book/2405">书籍</a></li>
                    <li><a href="http://demo.phalapi.net/">体验</a></li>
                    <li><a href="/about.html">关于</a></li>
                    <li><a href="/donate.html">贡献</a></li>
                    <li><a href="/wikis/en/">English</a></li>
                </ul>
            </div>
            <!--/.nav-collapse -->
        </div>
    </div>
    <!-- navbar end -->


    <div id="content">
        <div class="container">
            <div class="row row-md-flex row-md-flex-wrap">
                <h4><a href="/wikis/%5B5.2%5D-%E6%9D%82%E8%B0%88%EF%BC%9A%E6%89%AF%E4%B8%80%E4%BA%9BPhalApi%E7%9A%84%E5%89%8D%E4%B8%96%E5%92%8C%E4%BB%8A%E7%94%9F.html">上一章</a>   <a href="/wikis/">文档首页</a>   <a href="/wikis/%5B5.4%5D-%E8%AE%B8%E5%8F%AF.html">下一章</a></h4>
<hr />
<h2>5.3.1 术语表</h2>
<p>我们并不想“制造”一些新的术语来增加大家的学习成本，但为了更高效地进行专业交流，我们将PhalApi框架中所用到的一些概念进行提炼并罗列如下。</p>
<h3>(1)接口服务</h3>
<p>通常，我们把远程第三方提供的接口称为API。但秉承Web Service的概念，我们更愿称接口为服务。为了同时保留这两者的意思，我们在这里统一将API称为 <strong>接口服务</strong> 。也就是我们对应的?service=XXX.XXX 。  </p>
<h3>(2)资源服务</h3>
<p>在使用DI依赖注入进行注册的组件，我们也倾向称之为服务，同时也是一些服务端上可用的资源，如数据库、缓存、加解密等。因此统称为 <strong>资源服务</strong> 。</p>
<h2>5.3.2 PHP开发建议</h2>
<p>在实际项目开发过程中，通过观察不同开发人员编写的PHP代码，会很趣。因为你会发现每个人的编程风格都不尽相同，但我们更提倡约定编程、规范的代码和编写人容易理解的代码。所以，下面就发现的问题进行说明。  </p>
<h3>(1)滥用的静态方法</h3>
<p>很多框架和很多项目都说自己在使用面向对象编程，但其实很多时候是在类中全部使用静态方法的伪面向对象。这里可能会引发争议，因为有些同学会认为静态类方法比成员函数更快速，而且也确实有相关的数据表明是快了一点点（严格上来讲，很微小）。但作为代价，我们失去的更多。如我们没能使用动态，也不方便在单元测试时使用桩、短件、模拟等技巧。更为重要的是，失去了高层的概念提炼和规约层的约定，不利于接口和实现地分离。  </p>
<p>所以，请只有在需要的时候才使用静态static方法，如工具类或实用操作。</p>
<h3>(2)非真正意义上的单元测试</h3>
<p>很多时候，我看到很多框架和项目中没有单元测试的代码，就算有也不是真正意义上的单元测试。可测试的代码是美的，因为可测试的代码表明职责单一明了，有低耦合度，可以进行快速模拟和替换。关于单元测试，前面已有文档详细说明。  </p>
<p>所以，请尽量尝试和坚持PHPUnit单元测试，体验测试驱动开发的乐趣，体验浮现式设计的激动。</p>
<h3>(3)无处不在的单例模式</h3>
<p>很多同学在学习了设计模式后，都很想试用一把，所以往往在很多时候是为了“用设计模式”而用设计模式，而不考虑是否合适，是否真的需要。尤其对于单例模式，这种情况更为普遍。  </p>
<p>使用单例模式的时机包括有：提高系统性能、全局只能有且只有一个实例否则会导致问题发生、提供一个全局的公共访问点等。  </p>
<p>然而其他很多情况则不需要。例如很多情况，实例为某容器所持有，则只需要在容器内做数量控制即可，不需要被持有的实例再作单例控制。  </p>
<p>所以，请只有确切需要使用单例时才使用。</p>
<h2>5.3.3 PhalApi框架的不足</h2>
<p>在我们不断维护、演进PhalApi框架的同时，我们也在使用这个框架进行了很多项目的开发，与此同时也在阅读各方面的书籍以获得更深层次的理解。<br />
在这样实践、思考、再设计的不断反馈迭代后，我们看到了PhalApi确实在某方面表现得出色。  </p>
<p>但一个负责任的框架，应该也明确指出它的不足。<br />
这里，我们将PhalApi开发中的不足罗列如下，希望为你进行框架设计或者对PhalApi的使用有更好的理解。  </p>
<h3>(1)接口结果中msg应该改名为error</h3>
<p>我们推荐的接口返回格式为：</p>
<pre><code class="language-php">{
    "ret": 200,
    "data": {
        "code": 0,   //对操作码进行说明
        ....         //更多结果的说明
        "msg": ""
    },
    "msg": ""
}</code></pre>
<p>显然，上面两个msg字段，会给开发团队带来困惑或混淆。<br />
更好是应该把最外层的msg改成error更为贴切，因为只有错误时此字段才有效。</p>
<p>但基于前期的大量文档说明，此外层的ret、data、msg三个字段已约定。所以，只能从应用层的msg进行重命名，如tips。</p>
<h3>(2)对NotORM中limit操作的错误优化</h3>
<p>前期，由于没有深刻留意MySql中OFFSET关键字的作用，导致了做了一些不精确的优化。  </p>
<p>可注意以下的微妙区别：</p>
<pre><code class="language-php">limit 5 OFFSET 10   #从第10个位置开始，查询前5个

limit 5, 10         #从第5个位置开始，查询前10个</code></pre>
<p>但重点考虑到如果修复这个之前犯下的错误，会对项目升级后有很大的冲动。<br />
可预料的故障有：”升级后，首页列表无任何数据显示“和“升级后，列表数据过多导致App加载崩溃”。</p>
<p>最后，出于对已在开发或已上线项目的保护和承诺向前兼容的原则，我们不得不保留了这个污点。<br />
所以，当对底层进行改动时，须确保已透彻理解各操作的微妙区别。</p>
<h3>(3)对数据库操作封装的欠缺</h3>
<p>一直以来，数据库支持这块都是比较欠缺的。所以我们使用了NotORM。  </p>
<p>但我们为了能更好把NotORM与PhalApi整合，将它调整成更适合我们的使用方式，我们又为NotORM提供了一个封装层，类似代理。  </p>
<p>然而，这会为新手入门这个框架造成一定的迷惑。<br />
因为，这有两套操作数据库的区别。但他们一开始不能很好地理解这样的区别，以及这样设计的初衷。  </p>
<p>坦白来说，PhalApi对于数据库这块不是好的设计，但好在它可以使用并正常地工作。</p>
<hr />
<h4><a href="/wikis/%5B5.2%5D-%E6%9D%82%E8%B0%88%EF%BC%9A%E6%89%AF%E4%B8%80%E4%BA%9BPhalApi%E7%9A%84%E5%89%8D%E4%B8%96%E5%92%8C%E4%BB%8A%E7%94%9F.html">上一章</a>   <a href="/wikis/">文档首页</a>   <a href="/wikis/%5B5.4%5D-%E8%AE%B8%E5%8F%AF.html">下一章</a></h4><div style="float: left">
<h4>
<a href="http://qa.phalapi.net/">还有疑问？欢迎到社区提问！</a>
</h4>
</div>
            </div>
        </div>
    </div>

 <!-- 广告位 -->
<div class="grid-wrapper desktop-only">
	<p align="center">
		<a href="http://7xiz2f.com1.z0.glb.clouddn.com/%E6%88%91%E7%9A%84%E5%90%8D%E5%AD%97%E5%8F%AB%EF%BC%9A%CF%80%E6%A1%86%E6%9E%B6%20-%20PhalApi%202016%E5%B9%B4%E5%BA%A6%E5%BC%80%E6%BA%90%E6%80%BB%E7%BB%93%20-%20%E5%AE%98%E6%96%B9%E5%87%BA%E5%93%81.pdf" target="blank"><img width="950" height="100" src="http://7xiz2f.com1.z0.glb.clouddn.com/ad_20170104.png"></a>
		<a href="http://www.itran.cc/" target="blank"><img width="950" height="100" src="http://7xslqv.com1.z0.glb.clouddn.com/images/9/69/b88bc92455dc1239f9a5bf8d72929.png"></a>
		<a href="http://web-tools.phalapi.net/" target="blank"><img width="950" height="100" src="http://7xslqv.com1.z0.glb.clouddn.com/images/7/d0/88f523566c482296aecc43d185ca2.png"></a>
	</p>
</div>

        <!-- footer -->
        <div class="footer">
            <div class="link container ">
                <div class=" col-xs-7 col-sm-7 col-md-7 col-lg-7 ">
                    <h3>PhalApi (π框架)</h3>
                    <p>一个轻量级PHP开源接口框架，专注于接口服务开发，支持HTTP/SOAP/RPC协议，拥有自动生成的在线文档、多种开发语言的客户端SDK包以及可重用的扩展类库，可用于快速搭建微服务、RESTful接口或Web
                        Services。</p>
                    <!-- <p>:</p> -->
                    <span>友情链接:</span>
                    <a href="https://www.phalapi.net/" target="_blank"> PhalApi </a>
                    <a href="http://www.oschina.net/" target="_blank"> 开源中国 </a>
                    <a href="https://www.itran.cc/" target="_blank">艾翻译</a>
                    <a href="http://www.phalconphp.com/en/" target="_blank">Phalcon</a>
                    <a href="https://phpunit.de/manual/3.7/zh_cn/automating-tests.html" target="_blank">PHPUnit</a>
                    <a href="http://www.thoughtworks.com/cn/" target="_blank">ThoughtWorks</a>
                    <a href="mailto:chanzonghuang@gmail.com">友链交换</a>

                </div>
                <div class=" col-xs-5 col-sm-5 col-md-5 col-lg-5 contact_us ">
                    <h3>联系我们</h3>
                    <a href="https://github.com/phalapi/phalapi"><img src="../images/github.png" alt="github" /></a>
                    <a href="http://weibo.com/p/100808d236e99beb645bfb56ed1c37dde9b8bd?k=phalapi%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6&from=501&_from_=huati_topic"><img src="../images/weibo.png"  alt="weibo" /></a>
                    <a href="http://7xslqv.com1.z0.glb.clouddn.com/images/1/b0/894fde762850cb11250253f7d5ede.png"><img src="../images/zfb.png"  alt="zfb" /></a>
                    <a href="https://jq.qq.com/?_wv=1027&k=4A6reum"><img src="../images/qq.png"  alt="qq" /></a>
					<a href="http://git.oschina.net/dogstar/PhalApi"><img src="../images/git-oschina.png"  alt="git-oschina" /></a>
                </div>
                <div class="cls"></div>
                <div class="text-center copy_right"> ©2015-2017 PhalApi All Rights Reserved. <a href="http://www.miitbeian.gov.cn" target="_blank">粤ICP备15028808号</a>

				<script type="text/javascript">var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1255326144'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s4.cnzz.com/z_stat.php%3Fid%3D1255326144%26show%3Dpic' type='text/javascript'%3E%3C/script%3E"));</script>
                </div>
            </div>
        </div>
    </div>


    <a href="https://github.com/phalapi"><img id="gitHub_fllow" style="position: fixed; top: 0; right: 0; border: 0;z-index:9999" src="https://camo.githubusercontent.com/652c5b9acfaddf3a9c326fa6bde407b87f7be0f4/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6f72616e67655f6666373630302e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_orange_ff7600.png"></a>


    <script src="../js/jquery-1.11.1.min.js"></script>
    <script src="../js/bootstrap.min.js"></script>
</body>

</html>